# 引入必要的库
import time
import numpy as np
import yaml
import os
from joblib import dump as joblib_dump, load as joblib_load
from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input
from tensorflow.keras.preprocessing import image

# 获取 0_setting.yaml 中的键 key 对应的值 value
def get(key):
    with open('0_setting.yaml', 'r' ,encoding='utf-8') as file:
        data = yaml.safe_load(file)
    value = data[key]
    return value

# 预处理图像，把图像设置为指定大小之后，使用预训练的VGG16模型（不包括顶部全连接层）来提取图像的特征。
def preprocess_image(file_name, new_size ,model):
    # 1. 使用keras内置的读图程序,以new_size的尺寸读取图像文件,结果为一个PIL图像对象
    img = image.load_img(file_name, target_size=new_size)

    # 2. 将PIL图像对象转换为NumPy数组
    img = image.img_to_array(img)

    # 3. 把单幅图像放到一个数组中,提供批次信息
    img = np.expand_dims(img, axis=0)

    # 4. 使用VGG16模型的预处理函数对图像进行预处理,该步骤包括颜色空间的转换、缩放等
    img = preprocess_input(img)

    # 5. 使用 VGG16 模型对图像进行特征提取
    img = model.predict(img)

    # 6. 展平特征图，得到二维数组
    hog_edge = img.flatten()

    return hog_edge

# 用joblib把叫做 name 的对象 obj 保存(序列化)到位置 loc
def dump(obj, name, loc):
    start = time.time()
    print(f"把{name}保存到{loc}") 
    joblib_dump(obj, loc)
    end = time.time()
    print(f"保存完毕,文件位置:{loc}, 大小:{os.path.getsize(loc) / 1024 / 1024:.3f}M")
    print(f"运行时间:{end - start:.3f}秒")

# 用joblib读取(反序列化)位置loc的对象obj,对象名为name
def load(name, loc):
    print(f"从{loc}提取文件{name}")
    obj = joblib_load(loc)
    return obj